#include <string.h>
#include <iostream>
using std::cout;
using std::endl;

class CharArray{
public:
    CharArray(const char * pstr)
    : _capacity(strlen(pstr) + 1)
    , _data(new char[_capacity]())
    {
        strcpy(_data,pstr);
    }

    //第二个const表示这是一个const成员函数
    //在函数中不能修改数据成员
    //如果这个类有指针数据成员，仍然可以在这个const成员函数中
    //修改所指向的值，但是不能更改指向
    const char & operator[](size_t idx) const{
        if(idx >= 0 && idx < _capacity){
            /* _data[0] = 'X'; */
            //_capacity = 100;
            return _data[idx];
        }else{
            cout << "idx is invalid" << endl;
            static char nullchar = '\0';
            return nullchar;
        }
    }

    ~CharArray(){
        if(_data){
            delete [] _data;
            _data = nullptr;
        }
    }
private:
    size_t _capacity;
    char * _data;

};

void test0(){
    char arr[6] = "hello";
    cout << arr[0] << endl;
    arr[0] = 'H';
    cout << arr[0] << endl;
}

void test1(){
    CharArray ca("hello");
    cout << ca[0] << endl;
    //双重const的意义
    //第一个const确保返回的是一个const常量，不能进行修改
    //第二个const确保const对象也可以使用[]运算符
    /* ca[0] = 'H'; */
    cout << ca[0] << endl;
    const CharArray cb("world");
    cout << cb[0] << endl;


}

int main(void){
    /* test0(); */
    test1();
    return 0;

}
